"""
@name : 高阶函数作业
@author : FanMY_71
@projectname: Pycharm练习
@Time: 2022/7/13-20:23
"""
# 使用reduce，取出lst里的数字。然后转化为整形
# from functools import reduce
#
# lst = ["a", "1", "bb", "234", "", "9"]
# def func1(x, y):
#     return x + y
#
# print(int(reduce(func1,[i for i in lst if i.isdigit()])))

# 有以下列表：lst1=[7, -8, 5, 4, 0, -2, -5]
# • 正数在前负数在后
# • 正数从小到大
# • 负数从大到小
lst1 = [7, -8, 5, 4, 0, -2, -5]

# method1:
# # 从小到大
# sort_lst = sorted(lst1)
# # 从大到小
# sort_lst1 = sorted(lst1, reverse=True)
# positive = [i for i in sort_lst if i > 0]
# zero = [i for i in sort_lst if i == 0]
# negative = [i for i in sort_lst1 if i < 0]
# print(positive+zero+negative)

# method2:
# 这个函数的意思是：
# 整数返回本身，为0的情况返回1314，为负数的情况乘以-520+1314，那么这个数是一定会大于返回本身的正数的。
# 其实我们只要保证后面这个加数大于正数中的任意一个，那么就能保证这个题目有正确的解
print(sorted(lst1, key=lambda x: x * -520 + 1314 if x <= 0 else x))

# 这是一个字符串排序，排序规则：小写<大写<奇数<偶数
# • s = 'asdf234GDSdsf23' #排序:小写-大写-奇数-偶数
# • 原理：先比较元组的第一个值，FALSE
s = 'asdf234GDSds768f23'


def str_sort2(str1):
    for temp in str1:
        if temp.isdigit():
            if int(temp) % 2 == 0:
                return (True, True, temp)
            else:
                return (True, False, temp)
        else:
            if temp.islower():
                return (False, False, temp)
            else:
                return (False, True, temp)


print("".join(sorted(s, key=str_sort2)))
